এক্সেপশন হ্যান্ডলিং (Exception Handling) হলো C++ এর এমন একটি প্রক্রিয়া, যা প্রোগ্রাম চলাকালীন সময়ে অপ্রত্যাশিত বা ভুল (error) পরিস্থিতি ঘটলে তা সনাক্ত করে এবং সেই ভুলকে সঠিকভাবে পরিচালনা করতে সাহায্য করে। এক্সেপশন হ্যান্ডলিং প্রোগ্রামের কার্যক্রম নিরবচ্ছিন্ন রাখে এবং ব্যবহারকারীদের সাথে বন্ধুসুলভ ব্যবহার করে।
C++ এ এক্সেপশন হ্যান্ডলিং করার জন্য মূলত তিনটি কীওয়ার্ড ব্যবহৃত হয়:
try ব্লক: এমন একটি ব্লক যেখানে এক্সেপশন ঘটতে পারে এমন কোড থাকে। যদি কোনো এক্সেপশন ঘটে, তবে তা throw
দিয়ে ছুঁড়ে দেওয়া হয় এবং try
ব্লক থেকে catch
ব্লকে চলে যায়।
throw: try
ব্লকের মধ্যে যখন কোনো ত্রুটি ঘটে, তখন throw
ব্যবহার করে এক্সেপশনটি catch
ব্লকে পাঠানো হয়।
catch ব্লক: catch
ব্লক try
ব্লকে ছুঁড়ে দেওয়া এক্সেপশন ধরতে পারে এবং সেগুলোর জন্য প্রয়োজনীয় সমাধান ব্যবস্থা নিতে পারে।
নিচে এমন একটি উদাহরণ দেওয়া হলো যেখানে সংখ্যা ভাগ করার সময় ডিভাইড-বাই-জিরো ত্রুটি থেকে রক্ষা করার জন্য এক্সেপশন হ্যান্ডলিং ব্যবহার করা হয়েছে।
#include <iostream>
using namespace std;
int main() {
int numerator, denominator;
cout << "Enter numerator: ";
cin >> numerator;
cout << "Enter denominator: ";
cin >> denominator;
try {
if (denominator == 0) {
throw "Division by zero is not allowed!";
}
cout << "Result: " << numerator / denominator << endl;
}
catch (const char* msg) {
cout << "Error: " << msg << endl;
}
return 0;
}
বর্ণনা:
try
ব্লকে ভাগফল নির্ণয়ের জন্য কোড লেখা হয়েছে। যদি denominator
এর মান 0
হয়, তবে throw
ব্যবহার করে একটি বার্তা ছুঁড়ে দেওয়া হয়েছে।catch
ব্লক throw
দিয়ে ছুঁড়ে দেওয়া এক্সেপশন ধরেছে এবং সেই ত্রুটির বার্তা প্রিন্ট করেছে।একই try
ব্লকে একাধিক ধরনের এক্সেপশন ঘটতে পারে এবং সেগুলোর জন্য আলাদা আলাদা catch
ব্লক ব্যবহার করা যেতে পারে।
#include <iostream>
using namespace std;
int main() {
try {
int num1, num2;
cout << "Enter two numbers: ";
cin >> num1 >> num2;
if (num2 == 0) {
throw 0; // ইন্ট টাইপ এক্সেপশন
}
if (num1 < 0 || num2 < 0) {
throw "Negative numbers are not allowed"; // স্ট্রিং টাইপ এক্সেপশন
}
cout << "Result: " << num1 / num2 << endl;
}
catch (int e) {
cout << "Error: Division by zero" << endl;
}
catch (const char* msg) {
cout << "Error: " << msg << endl;
}
return 0;
}
বর্ণনা:
try
ব্লকে দুটি এক্সেপশন হতে পারে: num2
এর মান 0
হলে ইন্ট টাইপ এক্সেপশন ছুঁড়ে দেওয়া হয়েছে এবং num1
বা num2
এর মান ঋণাত্মক হলে স্ট্রিং টাইপ এক্সেপশন ছুঁড়ে দেওয়া হয়েছে।catch (int e)
এবং catch (const char* msg)
দুটি আলাদা catch
ব্লক ব্যবহার করে বিভিন্ন এক্সেপশন হ্যান্ডল করা হয়েছে।C++ এ catch(...)
ব্যবহার করে যেকোনো ধরনের এক্সেপশন ধরতে একটি সাধারণ catch
ব্লক তৈরি করা যায়, যা যেকোনো এক্সেপশন ধরতে পারে।
#include <iostream>
using namespace std;
int main() {
try {
throw 20;
}
catch (...) {
cout << "An exception occurred!" << endl;
}
return 0;
}
বর্ণনা:
catch (...)
সব ধরনের এক্সেপশন ধরতে সক্ষম, যার ফলে যেকোনো ধরনের এক্সেপশন হলেই এটি হ্যান্ডল করা যাবে।এক্সেপশন হ্যান্ডলিং প্রোগ্রামের নমনীয়তা বৃদ্ধি করে এবং ব্যবহারে আরও নিরাপত্তা প্রদান করে। এটি C++ প্রোগ্রামিংয়ে ত্রুটি মোকাবেলার একটি শক্তিশালী উপায়।
এক্সেপশন (Exception) হলো প্রোগ্রামে ঘটে যাওয়া এমন একটি অবস্থা বা ঘটনা, যা স্বাভাবিক প্রবাহে বাঁধা সৃষ্টি করে। C++ এ এক্সেপশন ব্যবস্থাপনার জন্য বিশেষ প্রক্রিয়া রয়েছে, যা প্রোগ্রাম চলাকালে কোনো অনাকাঙ্ক্ষিত সমস্যা দেখা দিলে তাকে সনাক্ত করে, পরিচালনা করে এবং প্রয়োজনীয় পদক্ষেপ গ্রহণ করতে সক্ষম করে।
ত্রুটি শনাক্তকরণ এবং ম্যানেজমেন্ট: প্রোগ্রামে বিভিন্ন ত্রুটি (যেমন, ডিভাইড বাই জিরো, মেমোরি অ্যাক্সেস সমস্যা) তৈরি হতে পারে। এক্সেপশন ব্যবস্থাপনা প্রোগ্রামকে সেসব ত্রুটি সনাক্ত এবং ম্যানেজ করতে সাহায্য করে।
প্রোগ্রামের স্থায়িত্ব বজায় রাখা: এক্সেপশন ব্যবস্থাপনা ব্যবহার করে প্রোগ্রামের ত্রুটিপূর্ণ অংশের জন্য সমাধান তৈরি করা যায় এবং প্রোগ্রামকে ত্রুটির পরে চলমান রাখা সম্ভব হয়, ফলে প্রোগ্রামের স্থায়িত্ব বাড়ে।
কোডের সরলতা বৃদ্ধি: এক্সেপশন ব্যবস্থাপনা ব্যবহার করে প্রোগ্রামারেরা ত্রুটি নির্ণয় এবং সমাধান নির্দিষ্ট স্থানে রাখতে পারে, যা কোডের পঠনযোগ্যতা এবং রক্ষণাবেক্ষণ সহজ করে।
অপ্রত্যাশিত পরিস্থিতি হ্যান্ডলিং: প্রোগ্রামে প্রায়ই কিছু অপ্রত্যাশিত অবস্থা তৈরি হতে পারে, যেমন ফাইল না খোলা, মেমোরি আউট অব রেঞ্জ ইত্যাদি। এক্সেপশন ব্যবস্থাপনা প্রোগ্রামকে অপ্রত্যাশিত পরিস্থিতির জন্য প্রস্তুত করে এবং সেই অনুযায়ী কাজ করতে সক্ষম করে।
C++ এ এক্সেপশন ব্যবস্থাপনার জন্য তিনটি মূল কীওয়ার্ড রয়েছে:
try
ব্লকের মধ্যে রাখা হয়।catch
ব্লক ব্যবহার করে নির্দিষ্ট এক্সেপশন ধরা হয় এবং প্রয়োজনীয় সমাধান নেওয়া হয়।throw
ব্যবহার করে একটি এক্সেপশন ছোড়া হয়।#include <iostream>
using namespace std;
int main() {
int numerator, denominator;
cout << "Enter numerator: ";
cin >> numerator;
cout << "Enter denominator: ";
cin >> denominator;
try {
if (denominator == 0) {
throw "Division by zero error"; // এক্সেপশন ছোড়া হচ্ছে
}
cout << "Result: " << numerator / denominator << endl;
} catch (const char* msg) {
cout << "Error: " << msg << endl; // এক্সেপশন ধরা হচ্ছে
}
return 0;
}
বর্ণনা:
try
ব্লকে denominator
এর মান 0
হলে, throw
দিয়ে "Division by zero error" নামে একটি এক্সেপশন ছোড়া হয়েছে।catch
ব্লক সেই এক্সেপশন ধরে এবং msg
এর মাধ্যমে ত্রুটি বার্তা প্রদর্শন করেছে।#include <iostream>
#include <stdexcept> // standard exceptions জন্য
using namespace std;
int main() {
try {
int *arr = new int[5];
throw runtime_error("Runtime error occurred!"); // Runtime exception ছোড়া
delete[] arr; // যদি উপরের লাইন কার্যকর হয় না, তবে এটি চলবে না
}
catch (const runtime_error& e) {
cout << "Caught a runtime_error: " << e.what() << endl;
}
catch (const exception& e) {
cout << "Caught an exception: " << e.what() << endl;
}
return 0;
}
বর্ণনা:
runtime_error
এক্সেপশন ছোড়া হয়েছে এবং catch
ব্লক ব্যবহার করে সেই ত্রুটি হ্যান্ডল করা হয়েছে।e.what()
ফাংশনটি ব্যবহার করে এক্সেপশনের বার্তা প্রদর্শন করা হয়েছে।স্ট্যান্ডার্ড এক্সেপশন: C++ এ stdexcept
লাইব্রেরি থেকে কিছু সাধারণ এক্সেপশন পাওয়া যায়, যেমন logic_error
, runtime_error
, overflow_error
, underflow_error
, ইত্যাদি।
কাস্টম এক্সেপশন: প্রোগ্রামারেরা নিজস্ব প্রয়োজন অনুযায়ী কাস্টম এক্সেপশন তৈরি করতে পারেন।
#include <iostream>
#include <exception>
using namespace std;
class CustomException : public exception {
public:
const char* what() const noexcept override {
return "Custom exception occurred!";
}
};
int main() {
try {
throw CustomException(); // কাস্টম এক্সেপশন ছোড়া হচ্ছে
}
catch (const CustomException& e) {
cout << e.what() << endl;
}
return 0;
}
বর্ণনা:
CustomException
নামে একটি কাস্টম এক্সেপশন ক্লাস তৈরি করা হয়েছে, যা exception
ক্লাস থেকে ইনহেরিট করা।throw CustomException();
ব্যবহার করে কাস্টম এক্সেপশন ছোড়া হয়েছে এবং catch
ব্লক সেটিকে ধরে e.what()
এর মাধ্যমে বার্তা প্রদর্শন করেছে।এক্সেপশন ব্যবস্থাপনা C++ প্রোগ্রামিংয়ে অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি প্রোগ্রামকে স্থায়ী এবং কার্যকর রাখতে সহায়ক।
C++ প্রোগ্রামিংয়ে try, catch, এবং throw ব্লক ব্যবহার করে এক্সেপশন হ্যান্ডলিং করা হয়। এগুলোর মাধ্যমে প্রোগ্রামের ভুল (error) বা অপ্রত্যাশিত পরিস্থিতিকে সনাক্ত করে তা সমাধান করা যায়।
try ব্লক: এখানে এমন কোড রাখা হয়, যেখানে এক্সেপশন (ত্রুটি) ঘটতে পারে। যখন একটি ত্রুটি ঘটে, তখন এটি throw
ব্যবহার করে ত্রুটিটি ছুঁড়ে দেয় এবং try
ব্লক থেকে বেরিয়ে যায়।
throw: যখন ত্রুটি ঘটে, তখন throw
অপারেটর ব্যবহার করে ত্রুটি (এক্সেপশন) catch
ব্লকে পাঠানো হয়। throw
এর সাথে এক্সেপশনের ধরণ উল্লেখ করা হয়, যেমন int
, char*
, string
ইত্যাদি।
catch ব্লক: catch
ব্লক throw
করা এক্সেপশন গ্রহণ করে এবং সেই অনুযায়ী ত্রুটি সমাধানের জন্য ব্যবস্থা গ্রহণ করে। catch
ব্লকের প্যারামিটারে এক্সেপশনের ধরণ উল্লেখ করতে হয়, যাতে সঠিক ধরনের এক্সেপশন হ্যান্ডল করা যায়।
নিচে একটি উদাহরণ দেওয়া হলো যেখানে দুইটি সংখ্যার ভাগফল নির্ণয় করার সময় ডিভাইড-বাই-জিরো ত্রুটি থেকে রক্ষা করার জন্য try, catch, এবং throw ব্লক ব্যবহার করা হয়েছে।
#include <iostream>
using namespace std;
int main() {
int numerator, denominator;
cout << "Enter numerator: ";
cin >> numerator;
cout << "Enter denominator: ";
cin >> denominator;
try {
if (denominator == 0) {
throw "Division by zero is not allowed!"; // throw দিয়ে এক্সেপশন ছুঁড়ে দেওয়া
}
cout << "Result: " << numerator / denominator << endl;
}
catch (const char* msg) { // catch ব্লক এক্সেপশন গ্রহণ করে
cout << "Error: " << msg << endl;
}
return 0;
}
বর্ণনা:
try
ব্লকের মধ্যে বিভাজন অপারেশন করা হয়েছে। যদি denominator
এর মান 0
হয়, তবে throw
দিয়ে একটি বার্তা (স্ট্রিং টাইপ) ছুঁড়ে দেওয়া হয়েছে।catch
ব্লকটি সেই বার্তাটি গ্রহণ করে এবং কনসোলে প্রিন্ট করে।আউটপুট (যদি denominator
এ 0 ইনপুট দেওয়া হয়):
Enter numerator: 10
Enter denominator: 0
Error: Division by zero is not allowed!
একই try
ব্লক থেকে বিভিন্ন ধরনের এক্সেপশন ছুঁড়ে দেওয়া যেতে পারে এবং সেগুলোর জন্য আলাদা আলাদা catch
ব্লক ব্যবহার করা যেতে পারে।
#include <iostream>
using namespace std;
int main() {
try {
int num1, num2;
cout << "Enter two numbers: ";
cin >> num1 >> num2;
if (num2 == 0) {
throw 0; // int টাইপ এক্সেপশন
}
if (num1 < 0 || num2 < 0) {
throw "Negative numbers are not allowed"; // string টাইপ এক্সেপশন
}
cout << "Result: " << num1 / num2 << endl;
}
catch (int e) {
cout << "Error: Division by zero" << endl;
}
catch (const char* msg) {
cout << "Error: " << msg << endl;
}
return 0;
}
বর্ণনা:
try
ব্লকে দুটি এক্সেপশন হতে পারে:num2
এর মান 0
হয়, তাহলে throw 0;
দিয়ে int
টাইপ এক্সেপশন ছুঁড়ে দেওয়া হয়।num1
বা num2
এর মান ঋণাত্মক হয়, তাহলে throw "Negative numbers are not allowed";
দিয়ে string
টাইপ এক্সেপশন ছুঁড়ে দেওয়া হয়।catch
ব্লক ব্যবহার করে বিভিন্ন এক্সেপশন হ্যান্ডল করা হয়েছে।C++ এ catch(...)
ব্যবহার করে যেকোনো ধরনের এক্সেপশন ধরতে একটি সাধারণ catch
ব্লক তৈরি করা যায়, যা যেকোনো এক্সেপশন ধরতে পারে।
#include <iostream>
using namespace std;
int main() {
try {
throw 20;
}
catch (...) {
cout << "An exception occurred!" << endl;
}
return 0;
}
বর্ণনা:
catch(...)
সব ধরনের এক্সেপশন ধরতে সক্ষম। try
ব্লক থেকে যেকোনো এক্সেপশন ছুঁড়ে দিলেও catch(...)
তা ধরবে।আউটপুট:
An exception occurred!
throw
দিয়ে ছুঁড়ে দেওয়া হয়।throw
অপারেটর ব্যবহার করে এক্সেপশন catch
ব্লকে পাঠানো হয়।throw
করা এক্সেপশন গ্রহণ করে এবং তার জন্য প্রয়োজনীয় সমাধান ব্যবস্থা গ্রহণ করে।C++ এ এক্সেপশন হ্যান্ডলিং ব্যবহার করে প্রোগ্রামকে আরও স্থিতিশীল এবং ব্যবহারকারীর সাথে বন্ধুসুলভ করা যায়।
কাস্টম এক্সেপশন (Custom Exception) হলো C++ এ প্রোগ্রামারের নিজের তৈরি করা এক্সেপশন, যা সাধারণত স্ট্যান্ডার্ড এক্সেপশন (যেমন std::runtime_error
বা std::logic_error
) থেকে আলাদা এবং নির্দিষ্ট ত্রুটিপূর্ণ অবস্থাগুলিকে আরও স্পষ্টভাবে নির্দেশ করে। কাস্টম এক্সেপশন ক্লাস তৈরি করে প্রোগ্রামের বিভিন্ন স্থানে নির্দিষ্ট ত্রুটি পরিচালনা করা সহজ হয়।
C++ এ কাস্টম এক্সেপশন তৈরি করার জন্য সাধারণত std::exception
ক্লাসটি ইনহেরিট করতে হয় এবং what()
মেথড ওভাররাইড করে কাস্টম ত্রুটি বার্তা প্রদান করা হয়।
#include <iostream>
#include <exception>
using namespace std;
class DivisionByZeroException : public exception { // কাস্টম এক্সেপশন ক্লাস
public:
const char* what() const noexcept override { // what() মেথড ওভাররাইড
return "Error: Division by zero is not allowed!";
}
};
int divide(int a, int b) {
if (b == 0) {
throw DivisionByZeroException(); // এক্সেপশন ছোড়া হচ্ছে
}
return a / b;
}
int main() {
try {
int result = divide(10, 0); // Division by zero এক্সেপশন ট্রিগার
cout << "Result: " << result << endl;
}
catch (const DivisionByZeroException& e) { // কাস্টম এক্সেপশন হ্যান্ডল করা
cout << e.what() << endl;
}
return 0;
}
বর্ণনা:
DivisionByZeroException
নামে একটি কাস্টম এক্সেপশন ক্লাস তৈরি করা হয়েছে, যা std::exception
ক্লাস থেকে ইনহেরিট করা।what()
মেথড ওভাররাইড করা হয়েছে, যা কাস্টম ত্রুটি বার্তা প্রদান করে।divide()
ফাংশনে যদি ডেনোমিনেটর 0
হয়, তবে DivisionByZeroException
এক্সেপশন ছোড়া হয়।main()
ফাংশনে catch
ব্লক সেই এক্সেপশন ধরে এবং what()
মেথডের মাধ্যমে ত্রুটি বার্তা প্রদর্শন করে।#include <iostream>
#include <fstream>
#include <exception>
using namespace std;
class FileNotFoundException : public exception {
public:
const char* what() const noexcept override {
return "Error: File not found!";
}
};
void openFile(const string& filename) {
ifstream file(filename);
if (!file.is_open()) {
throw FileNotFoundException(); // ফাইল না পাওয়া গেলে এক্সেপশন ছোড়া
}
cout << "File opened successfully!" << endl;
}
int main() {
try {
openFile("nonexistent.txt"); // যে ফাইলটি নেই তা ওপেন করতে চেষ্টা করা হচ্ছে
}
catch (const FileNotFoundException& e) { // কাস্টম এক্সেপশন ক্যাচ করা
cout << e.what() << endl;
}
return 0;
}
বর্ণনা:
FileNotFoundException
নামে একটি কাস্টম এক্সেপশন ক্লাস তৈরি করা হয়েছে, যা ফাইল না পাওয়ার ক্ষেত্রে নির্দিষ্ট ত্রুটি বার্তা প্রদান করে।openFile()
ফাংশনে যদি ফাইল খোলা সম্ভব না হয়, তবে FileNotFoundException
এক্সেপশন ছোড়া হয় এবং main()
এ catch
ব্লকে সেটি ধরা হয়।std::exception
ক্লাস থেকে ইনহেরিট করা: এটি করা জরুরি নয়, তবে করা হলে std::exception
এর বৈশিষ্ট্যগুলো সহজেই পাওয়া যায়।what()
মেথড ওভাররাইড করা: কাস্টম বার্তা প্রদানের জন্য what()
মেথড ওভাররাইড করে নির্দিষ্ট বার্তা প্রদান করা হয়।#include <iostream>
#include <exception>
#include <string>
using namespace std;
class CustomException : public exception {
string message;
public:
CustomException(const string& msg) : message(msg) {}
const char* what() const noexcept override {
return message.c_str();
}
};
int main() {
try {
throw CustomException("Custom error occurred with additional details."); // কাস্টম বার্তা সহ এক্সেপশন ছোড়া হচ্ছে
}
catch (const CustomException& e) {
cout << e.what() << endl; // কাস্টম বার্তা প্রদর্শন করা হচ্ছে
}
return 0;
}
বর্ণনা:
CustomException
ক্লাসে একটি কনস্ট্রাক্টর যোগ করা হয়েছে, যা একটি বার্তা গ্রহণ করে।what()
মেথড ওভাররাইড করে সেই বার্তা প্রদর্শন করা হচ্ছে।std::exception
ক্লাস থেকে ইনহেরিট করে কাস্টম এক্সেপশন ক্লাস তৈরি করা যায়।what()
মেথড ওভাররাইড করে কাস্টম বার্তা প্রদান করা যায়।কাস্টম এক্সেপশন ব্যবহার করে ত্রুটি হ্যান্ডলিং আরও নির্দিষ্ট এবং কার্যকরী করা যায়, যা বড় প্রোগ্রামে ত্রুটি সনাক্ত ও সমাধানকে সহজ করে।
common.read_more